package JUC;

/**
 * 死锁演示类
 * 死锁是指两个或两个以上的线程在执行过程中，因争夺资源而造成的一种相互等待的现象
 */
public class DeadLockDemo {

    /**
     * 资源类，包含两个锁对象
     */
    static class Resource implements Runnable {
        private String lockA;
        private String lockB;

        /**
         * 构造方法，初始化两个锁对象
         *
         * @param lockA 锁A
         * @param lockB 锁B
         */
        public Resource(String lockA, String lockB) {
            this.lockA = lockA;
            this.lockB = lockB;
        }

        /**
         * 线程运行方法
         * 当两个线程分别持有不同的锁，并尝试获取对方持有的锁时，会发生死锁
         */
        @Override
        public void run() {
            synchronized (lockA) {
                System.out.println(Thread.currentThread().getName()
                        + "获得锁 " + lockA + " 尝试获取锁" + lockB);
                synchronized (lockB) {
                    System.out.println(Thread.currentThread().getName()
                            + "获得锁 " + lockB + " 尝试获取锁" + lockA);
                }
            }
        }
    }

    /**
     * 主方法，创建两个线程，每个线程持有不同的锁
     *
     * @param args 参数数组
     */
    public static void main(String[] args) {

        new Thread((new Resource("lockA", "lockB")), "ThreadAAA").start();
        new Thread((new Resource("lockB", "lockA")), "ThreadBBB").start();
    }
}
